package 每日一题;

/**
 * 1401. 圆和矩形是否有重叠
 * 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ，其中 (x1, y1) 是矩形左下角的坐标，而 (x2, y2) 是右上角的坐标。
 *
 * 如果圆和矩形有重叠的部分，请你返回 true ，否则返回 false 。
 *
 * 换句话说，请你检测是否 存在 点 (xi, yi) ，它既在圆上也在矩形上（两者都包括点落在边界上的情况）。
 *
 *
 *
 * 示例 1 ：
 *
 *
 * 输入：radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
 * 输出：true
 * 解释：圆和矩形存在公共点 (1,0) 。
 * 示例 2 ：
 *
 * 输入：radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
 * 输出：false
 * 示例 3 ：
 *
 *
 * 输入：radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
 * 输出：true
 *
 *
 * 提示：
 *
 * 1 <= radius <= 2000
 * -104 <= xCenter, yCenter <= 104
 * -104 <= x1 < x2 <= 104
 * -104 <= y1 < y2 <= 104
 *
 * 清晰的解题思路
 * https://leetcode.cn/problems/circle-and-rectangle-overlapping/solution/by-baoya_uncle-nw90/
 *
 */
public class D230625_T1401 {

    // 让同半径的圆在 沿着矩形的变 走一圈  圆心走过的路线 是一个圆角矩形  题目中圆心 不在这个圆角矩形中 就没有中叠
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {

        if (pointInRectangle(xCenter,yCenter,x1,y1,x2,y2)) return true;

        if (pointInRectangle(xCenter,yCenter,x1,y2,x2,y2+radius)) return true;

        if (pointInRectangle(xCenter,yCenter,x2,y1,x2+radius,y2)) return true;

        if (pointInRectangle(xCenter,yCenter,x1,y1-radius,x2,y1)) return true;

        if (pointInRectangle(xCenter,yCenter,x1-radius,y1,x1,y2)) return true;

        if (pointInCircle(x1,y2,xCenter,yCenter,radius)) return true;
        if (pointInCircle(x2,y2,xCenter,yCenter,radius)) return true;
        if (pointInCircle(x2,y1,xCenter,yCenter,radius)) return true;
        if (pointInCircle(x1,y1,xCenter,yCenter,radius)) return true;

        return false;




    }

    /**
     * 判断一个点 是否在一个矩形中
     * @param xCenter 圆心 x轴坐标
     * @param yCenter     y坐标
     * @param x1    左下角 x坐标
     * @param y1    左下角 y坐标
     * @param x2    右上角 x坐标
     * @param y2    右上角 y坐标
     * @return  在矩形中返回true 不在返回false  ,在边上也算
     */
    public boolean pointInRectangle(int xCenter,int yCenter,int x1,int y1,int x2,int y2){

        //判断一个点 是否在矩形中(矩形平行坐标轴) 只要判断 在于上下边界 和左右边界中即可

        return xCenter>=x1&&xCenter<=x2&&yCenter>=y1&&yCenter<=y2;

    }

    //判断点 是否在以(x1,y1)为圆心 R为半径的圆 内
    public boolean pointInCircle(int xCenter,int yCenter,int x1,int y1,int R){

       return Math.abs(xCenter-x1)*Math.abs(xCenter-x1)+Math.abs(yCenter-y1)*Math.abs(yCenter-y1)<=R*R;

    }

}
